邊緣檢測是影像處理中用來找出物體邊界的關鍵技術。邊緣通常對應於影像中亮度急遽變化的位置,可協助分割物體、偵測輪廓,並提升後續分析的精度。
常見方法有 Sobel、Laplacian、Canny,各自適用於不同場景。
請準備一張灰階圖片 image.jpg
,並放在程式同一資料夾。
import cv2
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Original', img)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
Sobel 是一階導數運算,能分別檢測水平方向與垂直方向的邊緣,適合用於分析影像的方向性結構。
# Sobel X(水平方向邊緣)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# Sobel Y(垂直方向邊緣)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# 合併 X 與 Y,取得總邊緣強度
sobel_combined = cv2.magnitude(sobelx, sobely)
cv2.imshow('Sobel X', sobelx)
cv2.imshow('Sobel Y', sobely)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.Sobel(src, ddepth, dx, dy, ksize)
src
→ 輸入影像ddepth
→ 輸出影像深度(通常 cv2.CV_64F
)dx
/ dy
→ 導數方向(x=1,y=0 表水平;x=0,y=1 表垂直)ksize
→ Sobel 核大小(1、3、5、7)效果示意:可分別取得水平、垂直及綜合邊緣資訊
Laplacian 是二階導數運算,能同時檢測影像中所有方向的邊緣,適合用於全局邊緣偵測。
laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=3)
cv2.imshow('Laplacian', laplacian)
cv2.Laplacian(src, ddepth, ksize)
ddepth
→ 通常設為 cv2.CV_64F
ksize
→ 核大小(1, 3, 5 …)效果示意:可一次取得各方向的邊緣,對雜訊較敏感
Canny 是一種強大的邊緣檢測演算法,包含高斯模糊、梯度計算、非極大值抑制、雙閾值檢測等步驟。其結果乾淨且抗雜訊,常用於物體輪廓偵測。
canny = cv2.Canny(img, 100, 200)
cv2.imshow('Canny Edge', canny)
cv2.Canny(image, threshold1, threshold2)
threshold1
→ 低閾值threshold2
→ 高閾值👉 建議先嘗試 (100,200)
或 (50,150)
,再依需求調整。閾值設定會影響邊緣偵測的敏感度。
效果示意:可取得乾淨且連續的物體邊界
方法 | 特點 | 適用場景 |
---|---|---|
Sobel | 可分水平與垂直邊緣,方向性強 | 基本邊緣檢測、分析梯度方向 |
Laplacian | 同時偵測所有方向邊緣,對雜訊較敏感 | 全局邊緣檢測、快速輪廓擷取 |
Canny | 精確且抗雜訊,結果乾淨且連續 | 複雜影像、物體邊界偵測 |
Sobel 適合用於分析影像的方向性結構,Laplacian 可快速取得全局邊緣但易受雜訊影響,Canny 則最適合精確偵測物體輪廓,尤其在雜訊多或需求高精度時。
邊緣檢測是影像分析的基礎技術,其中 Canny 是最常用且效果最佳的方法,適合精確偵測物體輪廓;Sobel 與 Laplacian 則適合快速檢測或學習影像梯度結構。根據影像特性與需求,靈活調整參數能取得更理想的結果。